<?php
namespace app\index\controller;
use think\Controller;

use app\index\model\Queue as Redisqueue;

class Queue extends Controller
{

      
    public function index(){

        $redis = new \Redis();
        $redis->connect('127.0.0.1',6379);
        $redis_name = "miaosha";

        //检查redis链表长度（已存在数量)
        $num = 10;
        //秒杀用户涌入模拟,100个用户
        for ($i =0; $i < 100; $i++) {
            $uid = rand(1000,9999);
            if ($redis->lLen($redis_name) < 10 ) {
                //加入链表尾部
                $redis->rPush($redis_name, $uid.'%'.microtime());
            } else {  //如果达到10个
                //秒杀结束
                echo '<pre>';
                var_dump($uid."秒杀结束");
                echo '</pre>';
            }
        }

        
        $redis->close();
    }


    public function fang(){
        //从队列头部读一个值，判断这个值是否存在，如果存在则切割出时间、uid保存到数据库中。（对于redis而言，如果从redis取出这个值，那么这个值就不在redis队列里了，如果出现问题失败了，那么我们需要有一个机制把失败的数据重新放入redis链表中）
        $redis = new \Redis();
        $redis->connect('127.0.0.1',6379);
        $redis_name = 'miaosha';

        //死循环检测redis队列
        while(1) {
            $user = $redis->lpop($redis_name);
            if (!$user || $user == 'null') {  //如果没有数据跳出循环
                //如果一直执行，速度是非常快的，那么服务器压力大，这里2秒一次
                sleep(2);
                //跳出循环
                continue;
            } 
            //拿出微秒时间戳和uid
            $user_arr = explode('%', $user);
            $insert_data = array(
                'uid' => $user_arr[0],
                'time_stamp' => $user_arr[1]
            );
            $res = Redisqueue::insert($insert_data);
            //如果插入失败
            if (!$res) {
                //从哪个方向取出，从哪个方向插回
                $redis->lpush($redis_name, $user);
                sleep(2);
            }
        } 
        $redis->close();
    }
    
	

}
